// namespace 命名空间
// 避免全局变量造成污染
// 通过export 暴露出去的变量和方法，才能被其他模块所访问
namespace A {
  export let name = 'why'
}
A.name // why


// 对象混入
namespace B {
  interface A {
    name: string
  }
  interface B {
    age: number
  }

  let a: A = {
    name: 'why'
  }

  let b: B = {
    age: 18
  }

  // 对象混入 两个对象合并到一起
  //   1、扩展运算符 浅拷贝（第一层属性脱离引用，其他不会）返回新的类型
  let c = {...a, ...b}
  //   2、Object.assign() 浅拷贝  返回交叉类型 A & B
  let d = Object.assign({}, a, b)
  // 深拷贝 node版本在18以上 谷歌浏览器在96以上
  structuredClone(a)
}

